#!/usr/bin/perl -w

##参考：http://shohoji.net/blog/archives/000283.html
##

use strict;
use MeCab;
use CGI;

print "Content-Type: text/html\n\n";

my $cgi = new CGI;


print <<HTMLHEAD;
<html>
<body>
HTMLHEAD

my $str = "酢鶏は好きですが、鶏は嫌いかも。";


my $getstring = $cgi->param('str');

$getstring =~ s/<//g;
$getstring =~ s/>//g;
$getstring =~ s/\.\.//g;
$getstring =~ s/$//g;

if( (length $getstring) != 0){$str=$getstring;}

#print $getstring;

print <<FORM;
<form method="GET" action="malkov.cgi">
文章：<input type="text" name="str" size="50">
<input type="submit" value="解析" />
</form>
FORM

my @wakatigaki;

my $mecab = MeCab::Tagger->new();
my $node = $mecab->parseToNode($str);
print "[ ",$str," ]からマルコフ連鎖文を作成します。<br><br>";

print "<h3>分かち書き</h3>";
print "見出し / 読み / 品詞<br>";
for( ; $node; $node = $node->{next} ) {
    next unless defined $node->{surface};
    my $midasi = $node->{surface};
    my( $hinsi, $yomi ) = (split( /,/, $node->{feature} ))[0,7];
    print $midasi, " /  ", $yomi, " /  ", $hinsi, "<br>";

    #分かち書きした単語を記録
    push (@wakatigaki, $midasi);

}

# 「1語の接頭語と1語の接尾語」のマルコフ連鎖テーブルを作成
my $i;
my %markov;
if (@wakatigaki > 1) {
  # $markov{接頭語}[no]=接尾語 の形式
  for ($i = 1 ; $i < @wakatigaki ; $i++) {
    if ($i < @wakatigaki) {
      push(@{ $markov{$wakatigaki[$i-1]} }, $wakatigaki[$i]);
    }
  }
} else {
  print "文章が短すぎてマルコフ連鎖が行えません。<br />";
}

# マルコフ連鎖テーブルを表示(DEBUG)----------------------------
print "<h3>マルコフ連鎖テーブル</h3>";
print "<hr><pre>";
my $nbsp = '    ';
my $print_r = "Array<br />";
my $print_r .= "(<br />";

my $value;
foreach  $value (keys %markov) {
  $print_r .= $nbsp."[$value] => Array";
  $print_r .= "(<br />";
  for($i=0; $i<@{ $markov{$value} }; $i++) {
    $print_r .= $nbsp.$nbsp."[$i] => ".$markov{$value}[$i]."<br>";
  }
  $print_r .= $nbsp.")<br />";
}
$print_r .= ")<br />";
print $print_r;
print "</pre><hr>";
# マルコフ連鎖テーブルを表示 修了----------------------------
 

# マルコフ連鎖で文章生成----------------------------
# 文章出だしを接頭語前に
my $pre1 = $wakatigaki[0];
  
# 接尾語は選択できる中からランダムに選択
my $rand = int (rand (@{ $markov{$pre1} }));
my $suf1 = $markov{$pre1}[$rand];

my $string = $pre1.$suf1;
  
for ($i=0 ; $i<500 ; $i++) {
  $pre1 = $suf1;
  
  # 接尾語は選択できる中からランダムに選択
  $rand = int (rand (@{ $markov{$pre1} }));
  $suf1 = $markov{$pre1}[$rand];
  
  if (($suf1 eq "EOS\n") or ($suf1 eq "")) {
    last;
  }
  
  $string .= $suf1;
}

print "<h3>マルコフ連鎖で作成された文章</h3>";
print $string."<br />";
# マルコフ連鎖で文章生成----------------------------

print <<HTMLFOOT;
</body>
</html>
HTMLFOOT
